package in.lib.view;
import in.lib.manager.SettingsManager;
import in.lib.utils.Dimension;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewParent;
import android.widget.AbsListView;
import android.widget.ImageView;
public class ScrollableImageView extends ImageView implements HeadedListView.OnScrollListener
{
private HeadedListView mListParent;
private View mContainerView;
private boolean mCalculateScroll = true;
private int mImageHeight = 0;
private int mScaledImageHeight = 0;
private Dimension mDimension;
private int mMaxScrollSize;
public ScrollableImageView(Context context)
{
super(context);
}
public ScrollableImageView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
private void init()
{
mListParent = (HeadedListView)getScrollableView();
if (mListParent != null)
{
mListParent.addOnScrollListener(this);
}
mDimension = new Dimension(getContext());
}
@Override public void setImageBitmap(Bitmap bm)
{
super.setImageBitmap(bm);
mCalculateScroll = false;
if (bm != null)
{
mCalculateScroll = true;
mImageHeight = bm.getHeight();
double ratio = (double)getWidth() / (double)bm.getWidth();
mScaledImageHeight = (int)(bm.getHeight() * ratio);
}
}
@Override protected void onDetachedFromWindow()
{
super.onDetachedFromWindow();
if (mListParent != null)
{
mListParent.removeOnScrollListener(this);
}
}
@Override protected void onAttachedToWindow()
{
super.onAttachedToWindow();
init();
}
/**
* Look for HeadedListView
* @return
*/
private View getScrollableView()
{
ViewParent v = getParent();
while (true)
{
if (v == null) break;
if (v.getParent() instanceof HeadedListView)
{
mContainerView = (View)v;
}
if (v instanceof HeadedListView)
{
return (View)v;
}
v = v.getParent();
}
return null;
}
@Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
if (mContainerView != null && mImageHeight > 0 && mImageHeight > getHeight() + 50 && mCalculateScroll && SettingsManager.isInlineAnimationEnabled())
{
int[] pos = new int[2];
getLocationInWindow(pos);
mMaxScrollSize = (mScaledImageHeight - getHeight()) / 2;
if (pos[1] < mDimension.getScreenHeight() && pos[1] + getHeight() > 0)
{
int y = (pos[1] - (int)(mScaledImageHeight / 1.5)) + (getContext().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ? (int)(mDimension.getScreenHeight() / 1.5) : 0);
scrollTo(0, y);
if (y < -mMaxScrollSize)
{
scrollTo(0, -mMaxScrollSize);
}
if (y + getHeight() > -mMaxScrollSize + mScaledImageHeight)
{
scrollTo(0, mMaxScrollSize);
}
}
}
}
@Override public void onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY){}
@Override public void onScrollStateChanged(AbsListView view, int scrollState){}
}